/**
 * 分享码生成和解析工具
 * 用于生成安全的分享链接，避免用户通过ID规律暴力访问
 */

// 分享码配置
const SHARE_CONFIG = {
  // 分享码有效期（毫秒）- 30天
  EXPIRE_TIME: 30 * 24 * 60 * 60 * 1000,
  // 加密密钥（实际项目中应该从环境变量获取）
  SECRET_KEY: 'wedding-dress-share-2024',
};

/**
 * 生成分享码
 * @param dressId 婚纱ID
 * @returns 分享码
 */
export function generateShareCode(dressId: number): string {
  try {
    // 生成过期时间
    const expireTime = Date.now() + SHARE_CONFIG.EXPIRE_TIME;
    
    // 创建数据对象
    const data = {
      dressId,
      expireTime,
      timestamp: Date.now(),
    };
    
    // 转换为JSON字符串
    const jsonString = JSON.stringify(data);
    
    // 简单的Base64编码（实际项目中应该使用更安全的加密）
    const encoded = btoa(jsonString);
    
    // 添加随机后缀增加复杂度
    const randomSuffix = Math.random().toString(36).substring(2, 10);
    
    // 生成最终的分享码
    const shareCode = `${encoded}_${randomSuffix}`;
    
    // 存储到本地存储（用于验证）
    storeShareCode(shareCode, dressId);
    
    return shareCode;
  } catch (error) {
    console.error('生成分享码失败:', error);
    // 降级方案：使用简单的编码
    return `${btoa(dressId.toString())}_${Date.now()}`;
  }
}

/**
 * 解析分享码
 * @param shareCode 分享码
 * @returns 婚纱ID或null
 */
export function parseShareCode(shareCode: string): number | null {
  try {
    // 分离编码部分和随机后缀
    const parts = shareCode.split('_');
    if (parts.length < 2) {
      return null;
    }
    
    const encoded = parts[0];
    const randomSuffix = parts[1];
    
    // 解码
    const jsonString = atob(encoded);
    const data = JSON.parse(jsonString);
    
    // 检查是否过期
    if (data.expireTime && Date.now() > data.expireTime) {
      console.warn('分享码已过期');
      return null;
    }
    
    // 验证分享码是否有效
    if (!validateShareCode(shareCode, data.dressId)) {
      console.warn('分享码验证失败');
      return null;
    }
    
    return data.dressId;
  } catch (error) {
    console.error('解析分享码失败:', error);
    return null;
  }
}

/**
 * 存储分享码到本地存储
 * @param shareCode 分享码
 * @param dressId 婚纱ID
 */
function storeShareCode(shareCode: string, dressId: number): void {
  try {
    const shareCodes = getStoredShareCodes();
    shareCodes[shareCode] = {
      dressId,
      createTime: Date.now(),
    };
    localStorage.setItem('wedding_share_codes', JSON.stringify(shareCodes));
  } catch (error) {
    console.error('存储分享码失败:', error);
  }
}

/**
 * 获取存储的分享码
 * @returns 分享码对象
 */
function getStoredShareCodes(): Record<string, { dressId: number; createTime: number }> {
  try {
    const stored = localStorage.getItem('wedding_share_codes');
    return stored ? JSON.parse(stored) : {};
  } catch (error) {
    console.error('获取存储的分享码失败:', error);
    return {};
  }
}

/**
 * 验证分享码是否有效
 * @param shareCode 分享码
 * @param dressId 婚纱ID
 * @returns 是否有效
 */
function validateShareCode(shareCode: string, dressId: number): boolean {
  try {
    const shareCodes = getStoredShareCodes();
    const stored = shareCodes[shareCode];
    
    if (!stored) {
      return false;
    }
    
    // 检查ID是否匹配
    if (stored.dressId !== dressId) {
      return false;
    }
    
    // 检查是否过期（本地存储的分享码7天过期）
    const localExpireTime = 7 * 24 * 60 * 60 * 1000;
    if (Date.now() - stored.createTime > localExpireTime) {
      // 清理过期的分享码
      delete shareCodes[shareCode];
      localStorage.setItem('wedding_share_codes', JSON.stringify(shareCodes));
      return false;
    }
    
    return true;
  } catch (error) {
    console.error('验证分享码失败:', error);
    return false;
  }
}

/**
 * 清理过期的分享码
 */
export function cleanupExpiredShareCodes(): void {
  try {
    const shareCodes = getStoredShareCodes();
    const now = Date.now();
    const localExpireTime = 7 * 24 * 60 * 60 * 1000;
    
    let hasChanges = false;
    for (const [shareCode, data] of Object.entries(shareCodes)) {
      if (now - data.createTime > localExpireTime) {
        delete shareCodes[shareCode];
        hasChanges = true;
      }
    }
    
    if (hasChanges) {
      localStorage.setItem('wedding_share_codes', JSON.stringify(shareCodes));
    }
  } catch (error) {
    console.error('清理过期分享码失败:', error);
  }
}

/**
 * 检查分享码是否有效
 * @param shareCode 分享码
 * @returns 是否有效
 */
export function isValidShareCode(shareCode: string): boolean {
  const dressId = parseShareCode(shareCode);
  return dressId !== null;
}
